#include <dos.h>
int int86x(intno,inregs,outregs,segregs);
int intno; номер (число) прерываний
union REGS *inregs; значение регистров при вызове
union REGS *outregs; значение регистров при возврате
struct SREGS *segregs; значение сегментов при вызове
Описание.
Функция int86x выполняет прерывание 8086 программного обеспечения, которое определено номером прерывания intno . В отличие от функции int86 , функция int86x принимает значения регистра сегмента в segregs , позволяя программам, использующим сегменты данных большой модели или far -указатели, определять, какой сегмент или указатель должен быть использован в процессе системного вызова. Перед выполнением определенного прерывания int86x копирует содержимое inregs и segregs в соответствующие регистры. В segregs используются только значения регистров DS и ES. После возврата прерываний функция копирует значения текущего регистра в outregs и перезаписывает DS . Она также копирует состояние (статус) переносимого флага системы в поле cflag , содержащееся в outregs . Аргументы inregs и outregs являются объединениями типа REGS . Аргумент segregs является структурой типа SREGS . Эти типы объявлены в include -файле <dos.h> . Использование функции int86x предназначено для прямого вызова прерываний DOS , которые берут аргумент в регистре ES или значение регистра DS, которое отличается от умалчиваемого сегмента данных.
Возвращаемое значение.
Возвращаемым значением является значение в регистре AX после возвращения прерываний. Если поле flag в outregs является ненулевым, возникает ошибка и переменная _doserrno также устанавливает соответствующий код ошибки.
Замечание!
Значения сегмента для аргумента segreg могут быть получены либо при использовании функции segread , либо макро FP_SEG.
Пример:
#include <signal.h>
#include <dos.h>
#include <stdio.h>
#include <process.h>
/* процедура int86x используется для генерирования прерыва-
ния 0х21 (системный вызов), который, в свою очередь, активизирует
системный вызов "Изменение атрибутов" DOS. Здесь используется
процедура int86x, поскольку ссылка на имя файла может находиться
в сегменте, отличном от умалчиваемого сегмента данных (ссылка при
помощи far-указателя), поэтому регистр DS может быть точно уста-
новлен со структурой SREGS. */
#define SYSCALL 0x21
/* INT 21H вызывает системные вызовы */
#define CHANGE_ATTR 0x43
/* системный вызов 43H - изменения атрибутов */
char far *filename;
/* имя файла в far-сегменте данных */
union REGS inregs, outregs;
struct SREGS segregs;
int result;
.
.
.
inregs.h.ah=CHANGE_ATTR;
/* AH - номер (число) системного вызова */
inregs.h.al=0;
/* AL - функция вызова атрибутов */
inregs.x.dx=FP_OFF(filename);
/* DS:DX указывают на имя файла */
segregs.ds=FP_SEG(filename);
result=int86x(SYSCALL,&inregs,&outregs,&segregs);
if (outregs.x.cflag) {
printf("can't get attributes of file; error
number %d\n", result);
exit(1);
}
else {
printf("Attribs=%#x\n", outregs.x.cx);
}